#include "netUtil.h"
#include "SessionClientSurServeur.h"


//-------------------------------------initialisation du socket serveur
int initSocketServeur(int port)
{
  struct sockaddr_in serv_addr;
  int val, sock= socket(AF_INET, SOCK_STREAM, 0);
  if (sock==-1){
    printf("Erreur fonction socket!!!\n");
    return -1;
  }
  bzero((char *) &serv_addr, sizeof(serv_addr));
  serv_addr.sin_family          = AF_INET;
  serv_addr.sin_addr.s_addr     = htonl(INADDR_ANY);
  serv_addr.sin_port            = htons(port);

  val=bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
  if (val==-1){
    printf("Erreur bind!!!\n");
    return -1;
  }
  val=listen(sock,5);
  if (val==-1){
    printf("Erreur bind!!!\n");
    return -1;
  }
  return sock;
}

void *gereClient(void *arg)
{
    cout<<"Debut de la gestion du client.\n";
    GereClient client = *((GereClient*)arg);
    SessionClientSurServeur *session = new SessionClientSurServeur(client);
    session->gere();

    // fin de la gestion du client.
    cout<<"Fin de la gestion du client.\n";
    pthread_cancel(client.thread);
    shutdown(client.socket, 2);
    close(client.socket);
    return NULL;
}

/*

//le paramètre est une chaine terminée par le caractere nul,
//envoie cette chaine puis une caractere de fin de ligne
void ecrireLigne(int fd, char *chaine){
  write(fd, chaine, strlen(chaine));
  write(fd, "\n", 1);
}

//lit une chaine (pas plus de max caractères) terminée par un caractere de fin de ligne
//et place un caractere terminal nul, retourne le nombre de caracteres de la chaine lue
//en cas d'erreur retourne -1
//on suppose que l'espace pointé par chaine a été alloué
int lireLigne(int fd, char *chaine, int max){
  int i=0, nb;
  do {
    nb=read(fd, chaine+i, 1);
    if (nb==-1) return -1;
    i+=nb;
  } while ((i<max)&&(chaine[i-1]!='\n'));
  chaine[i-2]='\0';
  return i-2;
}

//retourne l'adresse (chaine) associé à une structure d'adresse
char *decodeAddr(struct sockaddr_in addr){
  struct hostent * info=gethostbyaddr((char *)&addr.sin_addr.s_addr,4,AF_INET);
  if (info) {
    char *ad=(char *)malloc(strlen(info->h_name)+1);
    strcpy(ad, info->h_name);
    return ad;
  } else return (char*)"inconnu";
}

// Lit un entier sur une socket.
int lireEntier(int socket) // lit un entier.
{
  int value = -1;
  int nbOctetsALire = 4;
  int nbOctetsLu = 0;
  do
    {
      nbOctetsLu+= read(socket, &value+nbOctetsLu, nbOctetsALire-nbOctetsLu);
    }
  while(nbOctetsALire!=nbOctetsLu);
  value = ntohl(value);

  return value;
}

// Ecrit un entier sur une socket.
void ecrireEntier(int socket, int entier)
{
  int value = htonl(entier);
  write(socket, &value, 4);
}

// Lit une chaine de caractères sur une socket.
char *lireChaine(int socket) // lit une chaine de caractères.
{
  char *value = 0;
  int nbOctetsALire = 0;
  int nbOctetsLu = 0;
  nbOctetsALire = lireEntier(socket); // On récupère le nombre d'octets à lire.
  value = new char[nbOctetsALire + 1];
  value[nbOctetsALire] = 0;
  cout<<"nombre de char: "<<nbOctetsALire<<endl;
  do
    {
      nbOctetsLu+= read(socket, value+nbOctetsLu, nbOctetsALire-nbOctetsLu);
    }
  while(nbOctetsALire!=nbOctetsLu);

  return value;
}

// Ecrit une chaine de caractères sur une socket.
void ecrireChaine(int socket, char *chaine)
{
  int nbChar = strlen(chaine);
  ecrireEntier(socket, nbChar); // On ecrit le nombre de carateres de la chaine.
  write(socket, chaine, nbChar); // On écrit la chaine de caracteres.
}


// Lit une liste de chaines de caractères sur une socket.
ListeChaines *lireListeChaines(int socket)
{
  ListeChaines *value = 0;
  int nbChaines = 0;
  nbChaines = lireEntier(socket);
  cout<<"nombre de chaines: "<<nbChaines<<'\n';
  value = new ListeChaines(nbChaines);
  for(int i = 0; i < nbChaines; ++i)
    {
      value->listeChaines[i] = lireChaine(socket);
      cout<<value->listeChaines[i]<<endl;
    }

  return value;
}

// Ecrit une liste de chaines de caractères sur une socket.
void ecrireListeChaines(int socket, ListeChaines *listeChaines)
{
  ecrireEntier(socket, listeChaines->nbChaines); // On écrit le nombre de chaines à envoyer.
  for(int i = 0; i < listeChaines->nbChaines; ++i) // On écrit toutes les chaines.
    {
      ecrireChaine(socket, listeChaines->listeChaines[i]);
    }
}

*/
